--面向对象 类 对象 继承 构造 析构

t1={id=1,name="lisi"}

t1.getId=function(obj)
    return obj.id
end

print("t1.id",t1.getId(t1))

t2=t1
print("t2.id",t2.getId(t2))

t1=nil
print("t2.id",t2.getId(t2))

--self
t1={id=1,name = "李四"}
function t1:getName()
    return self.name
end
print("t1.name",t1:getName())

--自己索引自己
t1={id=1,name = "李四"}
meta={age=10}
meta.__index=meta
setmetatable(t1,meta)
print("t1.age",t1.age)


--自索引实现继承
father={a=1,b=2}
function father:faSay()
    print("father say")
end
father:faSay()

--给自己添加索引 索引就是本身
father.__index=father

son={c=1}
function son:sonSay()
    print("son say")
end
son:sonSay()
print("继承")
setmetatable(son,father)
son:sonSay()
son:faSay()

--类实例化
print("类实例化")
t1={id=1,name = "李四"}
t2=t1
print("t1,t2",t1,t2)
--自己索引自己
t1.__index=t1
function t1:new()
    obj={}
    setmetatable(obj,self)
    return obj
end

t3=t1:new()
print("t3",t3,"t1",t1)
print("t3.id",t3.id)
--自己索引自己
t3.__index=t3
t4=t3:new()
print("t4",t4,"t3",t3)
print("t4.id",t4.id)

--带参实例化
print("带参实例化")
t1={id=1,name = "李四"}
t1.__index=t1
function t1:new(obj)
    obj=obj or {}
    setmetatable(obj,self)
    return obj
end

t2=t1:new({id=2})
print("t2",t2,"t1",t1)
print("t2.id",t2.id)


--多重继承
print("多重继承优化")
t1={
    id=1,
    say=function()
        print("say")
    end
}
t1.__index=t1
function t1:new()
    obj={}
    setmetatable(obj,self)
    self.__index=self --自己索引自己
    return obj
end

t2=t1:new()

t3=t2:new()

t4=t3:new()

print("t4.id",t4.id)
print("t4.say",t4.say())

--成员变量私有化
print("成员变量私有化")
function newUser()
    id=1
    function getId()
        return id
    end
    --不暴露的方法是私有方法
    function getName()
        return "李四"
    end
    return {
        getId=getId
    }
end
user=newUser()
print("user.id",user.id)
print("user.getId()",user.getId())
